--
-- edu - arbil 2021
--

CREATE OR REPLACE FUNCTION get_comm_afipcbtesasoc(character varying)
  RETURNS text AS
$BODY$
DECLARE
pIdsComms 		ALIAS FOR $1;

vComillas		VARCHAR(1);
vEnter			TEXT;
vResultado		TEXT;
vSgnMnr                 TEXT;
vSgnMyr                 TEXT;
vBarraSgnMyr            TEXT;
BEGIN

-- Recibe un string con una lista de idcomms de las facturas para generar el xml del campo comm.afipcbtesasoc para una ND / NC.
-- Devuelve el valor de ese campo (un string)
-- Para probar:   SELECT get_comm_afipcbtesasoc('1779522, 1779528, 1779540')

/*
Ejemplo de Campos en comm para NC y ND electronicas
---------------------------------------------------

- comm.afipcbtesasoc: comprobantes asociados
- Las comillas deben ser dobles pero le pusimos simples porque el odbc las elimina al migrar.
- Los corchetes deben los brackets de un XML, pero el odbc no los admite al migrar.
[DATAPACKET Version='2.0']
[METADATA]
[FIELDS]
[FIELD attrname='tipo' fieldtype='i2'/]
[FIELD attrname='ptovta' fieldtype='i4'/]
[FIELD attrname='nro' fieldtype='i4'/]
[FIELD attrname='cbtefch' fieldtype='dateTime'/]
[FIELD attrname='cuitemisor' fieldtype='string' WIDTH='11'/]
[/FIELDS]
[(METADATA]
[ROWDATA]
[ROW RowState='4' tipo='1' ptovta='5' nro='15' cbtefch='20210412' cuitemisor='30648593542'/]
[ROW RowState='4' tipo='1' ptovta='5' nro='16' cbtefch='20210412' cuitemisor='30648593542'/]
[/ROWDATA]
[/DATAPACKET]
*/

-- Se reemplazan los brackets por caracteres html para no interferir en el xml que espera el importador.
-- No olvidemos que todo el resultado de la funcion es el valor que se debe asignar a un campo de tipo clientDataSet y que casualmente se trata de un xml.
-- Este tipo de dato, NUNCA debera contener brackets como dato, porque se interpretaran como tags y habra problemas.

IF COALESCE(pIdsComms, '') = '' THEN
   RETURN NULL;
END IF;   
vSgnMnr:= '&lt;';
vSgnMyr:= '&gt;';
vBarraSgnMyr:= '/'||vSgnMyr;
vEnter:= chr(13);

vResultado:= vSgnMnr || 'DATAPACKET Version=' || str_entre_comillasdobles('2.0') || vSgnMyr || vEnter ||
             vSgnMnr || 'METADATA' || vSgnMyr || vEnter ||
             vSgnMnr || 'FIELDS' || vSgnMyr || vEnter ||
             vSgnMnr || 'FIELD attrname=' || str_entre_comillasdobles('tipo') || ' fieldtype=' || str_entre_comillasdobles('i2') || vBarraSgnMyr|| vEnter ||
             vSgnMnr || 'FIELD attrname=' || str_entre_comillasdobles('ptovta') || ' fieldtype=' || str_entre_comillasdobles('i4') || vBarraSgnMyr|| vEnter ||
             vSgnMnr || 'FIELD attrname=' || str_entre_comillasdobles('nro') || ' fieldtype=' || str_entre_comillasdobles('i4') || vBarraSgnMyr|| vEnter ||
             vSgnMnr || 'FIELD attrname=' || str_entre_comillasdobles('cbtefch') || ' fieldtype=' || str_entre_comillasdobles('dateTime') || vBarraSgnMyr|| vEnter ||
             vSgnMnr || 'FIELD attrname=' || str_entre_comillasdobles('cuitemisor') || ' fieldtype=' || str_entre_comillasdobles('string') || ' WIDTH=' || str_entre_comillasdobles('11') || vBarraSgnMyr || vEnter ||
             vSgnMnr || '/FIELDS' || vSgnMyr || vEnter ||
             vSgnMnr || '/METADATA' || vSgnMyr || vEnter ||
             vSgnMnr || 'ROWDATA' || vSgnMyr || vEnter;
             
vResultado:= vResultado || 
		( SELECT ARRAY_TO_STRING( ARRAY (
		(SELECT vSgnMnr || 
		       'ROW RowState=' || str_entre_comillasdobles('4') ||
		       ' tipo=' || str_entre_comillasdobles(CAST(comm.afipcbtetipo AS TEXT)) ||
		       ' ptovta=' || str_entre_comillasdobles(CAST(comm.nroptovta AS TEXT)) ||
		       ' nro=' || str_entre_comillasdobles(CAST(comm.nro AS TEXT)) ||
		       ' cbtefch=' || str_entre_comillasdobles(trim(to_char(comm.fecha, 'YYYYMMDD'))) ||
		       ' cuitemisor=' || str_entre_comillasdobles(str_solo_digitos(ambemp.cuit)) ||
		       vBarraSgnMyr
		FROM comm
		JOIN ambempsuc ON comm.codambsuc = ambempsuc.codambsuc
		JOIN ambemp ON ambempsuc.codambemp = ambemp.cod
		WHERE comm.id = ANY (string_to_array(pIdsComms, ',')::int[])
		ORDER BY comm.id )
		       ), vEnter ) );
vResultado:= vResultado || vEnter || vSgnMnr || '/ROWDATA'|| vSgnMyr || vEnter || vSgnMnr || '/DATAPACKET'|| vSgnMyr;

RETURN vResultado;

END
$BODY$
  LANGUAGE plpgsql VOLATILE  COST 100;
ALTER FUNCTION get_comm_afipcbtesasoc(character varying) OWNER TO abacouser;


-- =================================
SELECT aaVersion('454.01','454.00');
-- =================================